﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>OnNotify (界面) - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The OnNotify method of a 界面控件 对象 registers a function or method to be called when a control notification is received via the WM_NOTIFY message." />
<meta name="ahk:equiv-v1" content="commands/GuiControl.htm" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css">
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>OnNotify</h1>
<p>注册一个函数或方法, 当通过 <a href="https://msdn.microsoft.com/library/bb775583">WM_NOTIFY</a> 消息接收到控制通知时调用.</p>
<pre class="Syntax">界面控件.<span class="func">OnNotify</span>(NotifyCode, Callback <span class="optional">, AddRemove := 1</span>)</pre>

<h2 id="Parameters">参数</h2>
<dl>
  <dt>界面控件</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#objects">对象</a></p>
    <p>要监控的控件的 <a href="GuiControl.htm">界面控件</a> 对象.</p>
  </dd>
  
  <dt>NotifyCode</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
    <p>要监控的控件定义的通知代码.</p>
  </dd>
  
  <dt>Callback</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a>或<a href="../Concepts.htm#objects">对象</a></p>
    <p>事件发生时要调用的函数, 方法或对象.</p>
    <p>如果这个参数是一个字符串, 它的含义取决于 界面 是否有<a href="../objects/Gui.htm#EventObj">事件接收器</a>(即是否指定了 <a href="../objects/Gui.htm#New">界面.新建</a> 的 <em>EventObj</em> 参数). 如果 界面 有事件接收器, 那么这个字符串必须是属于事件接收器的方法的名称; 否则, 它必须是一个函数的名称.</p>
    <p>无论 界面 是否有事件接收器, 要注册一个函数, 请传递<a href="Func.htm">函数引用</a>.</p>
  </dd>
  
  <dt>AddRemove</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
    <p>以下数值之一:<br>
    <strong>1</strong>(默认): 在任何先前注册的回调之后调用回调.<br>
    <strong>-1</strong>: 在任何先前注册的回调之前调用回调.<br>
    <strong>0</strong>: 不调用该回调.</p>
  </dd>
</dl>

<h2 id="WM_NOTIFY">WM_NOTIFY</h2>
<p>每当发生要监控事件或控件需要从程序中获取信息时, 某些类型的控件就会发送一条 <a href="https://msdn.microsoft.com/library/bb775583">WM_NOTIFY</a> 消息. 该消息的 <em>lParam</em> 参数包含一个指向包含通知信息的结构的指针. 结构的类型取决于通知代码和触发通知的控件类型, 但总是基于 <a href="https://msdn.microsoft.com/library/bb775514">NMHDR</a>.</p>
<p>要确定哪些通知是可用的(如果有的话), 它们提供的结构类型以及它们如何解释返回值, 请参考控件的文档. <a href="https://msdn.microsoft.com/library/bb773169">Control Library (MSDN)</a> 包含了每个 Windows 常用控件的链接. 通知代码(编号) 可以在 Windows SDK 中找到, 或者在互联网上搜索.</p>
<p>AutoHotkey 使用 <em>idFrom</em> 和 <em>hwndFrom</em> 字段来识别是哪个控件发送的通知, 以便将其派遣到相应的对象. <em>code</em> 字段包含通知代码. 由于这些字段必须与用于注册回调的 <em>界面控件</em> 和 <em>NotifyCode</em> 相匹配, 所以它们对脚本很少有用.</p>

<h2 id="Callback_Parameters">Callback 参数</h2>
<p><a href="GuiOnEvent.htm#Callback_Parameters">OnEvent</a> 中关于 <code>this</code> 和绑定函数的说明, 也适用于 OnNotify.</p>
<p>回调接收两个参数:</p>
<pre class="Syntax"><i>Callback</i>(界面控件, lParam)</pre>
<p>如上所述, <em>lParam</em> 是 <a href="https://msdn.microsoft.com/library/bb775514">NMHDR</a> 导出的通知结构的地址. 它的确切类型取决于控件和通知代码的类型. 如果该结构包含了关于通知的附加信息, 回调可以用 <a href="../commands/NumGet.htm">获取数值</a> 和/或 <a href="../commands/StrGet.htm">获取字符串</a> 检索它.</p>

<h2 id="Callback_Return_Value">Callback 返回值</h2>
<p>如果一个事件已经注册了多个回调, 回调可以返回一个非空值, 以防止任何剩余的回调被调用.</p>
<p>根据通知的不同, 返回值可能有额外的意义. 例如, 如果回调返回 TRUE(1), ListView 通知 <a href="https://msdn.microsoft.com/library/bb774798">LVN_BEGINLABELEDIT</a>(-175 或 -105) 会阻止用户编辑标签.</p>

<h2 id="Related">相关</h2>
<p><a href="GuiOnEvent.htm">OnEvent</a> 的说明也适用于 OnNotify: <a href="GuiOnEvent.htm#Threads">线程</a>, <a href="GuiOnEvent.htm#Destroying_the_GUI">销毁 GUI</a>.</p>
<p><a href="GuiOnCommand.htm">OnCommand</a> 可以用于作为 WM_COMMAND 消息发送的通知.</p>

</body>
</html>